package com.note.feng.leetcode.algorithms.easy.eight;

import java.util.HashSet;
import java.util.Set;

public class EightHundredFiftyNine {
    /**
     * 859 亲密字符串
     * 给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
     *
     * 交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
     *
     * 例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
     *
     * 示例 1：
     *
     * 输入：s = "ab", goal = "ba"
     * 输出：true
     * 解释：你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 相等。
     * 示例 2：
     *
     * 输入：s = "ab", goal = "ab"
     * 输出：false
     * 解释：你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 不相等。
     * 示例 3：
     *
     * 输入：s = "aa", goal = "aa"
     * 输出：true
     * 解释：你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa"，此时 s 和 goal 相等。
     *
     * 提示：
     *
     * 1 <= s.length, goal.length <= 2 * 104
     * s 和 goal 由小写英文字母组成
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/buddy-strings
     */
    /**
     * 解法：枚举
     * 如果两个字符串的长度不同，或者长度为 1 ，直接返回 false ， 一定不是亲密字符串
     * 亲密字符串有几种情况：
     * 1、两个字符串相同，并且有两个字符是相同的；
     * 2、两个字符串有两个字符，在同一下标时不同，并且这两组字符分别相等；
     * @param s
     * @param goal
     * @return
     */
    public boolean buddyStrings(String s, String goal) {
        int a = s.length(),b = goal.length();
        if(a != b || a == 1){
            return false;
        }
        if(s.equals(goal)){
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < a; i++) {
                if(!set.add(s.charAt(i))){
                    return true;
                }
            }
            return false;
        }else{
            int left = -1,right = -1;
            for (int i = 0; i <a ; i++) {
                if(s.charAt(i) != goal.charAt(i)){
                    if(left == -1){
                        left = i;
                    }else if(right == -1){
                        right = i;
                    }else{
                        return false;
                    }
                }
            }
            return right > 0 && s.charAt(left) == goal.charAt(right) && s.charAt(right) == goal.charAt(left);
        }
    }
}
